/**
 * 用两个栈模拟一个队列,已知栈的4个运算定义如下：
 * Push(S,x);		//元素x入栈S
 * Pop(S,x);		//S出栈并将出栈的值给x
 * StackEmpty(S);	//判断栈S是否为空
 * StackOverFlow(S)	//判断栈S是否已满
 * 
 * 如何实现队列的以下3种运算
 * EnQueue;			//将元素x入队列
 * DeQueue;			//将元素x出队列
 * QueueuEmpty;		//判断队列是否为空
 */

//判断队里是否为空
bool QueueEmpty(Stack &s1, Stack &s2)
{
	return (StackEmpty(s1) && StackEmpty(s2)) ? true : false;
}

//入队列
bool EnQueue(Stack &s1, Stack &s2, ElemType e)
{
	//判断栈s1是否已满
	if(!StackOverFlow(s1))
	{
		Push(s1, e);
		return true;
	}
	
	if(StackOverFlow(s1) && !StackEmpty(s2))
	{
		//栈s1已满,但是栈s2不为空
		printf("栈已满\n");
		return false;
	}
}

//出队列
void DeQueue(Stck &s1, Stack &s2)
{
	//如果第二个栈非空，直接出栈
	if(!StackEmpty(s2)) Pop(s2, x);
	
	else if(StackEmpty(s1)) printf("队列已空\n");
	
	else {
		//将第一个栈中的元素出栈，然后入栈到s2
		while(!StackEmpty(s1))
		{
			Pop(s1, x);
			Push(s2, x);
		}
		//s2中Pop出的第一个元素就是队列首元素
		Pop(s2, x);
		//再将原来的元素入栈s1
		while(!StackEmpty(s2))
		{
			Pop(s2, x);
			Push(s1, x);
		}
	}
}
